<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        const arr = [
            { name: '' },
            { name: 'dfv' },
            { name: 'dfv' },
            'hello world',
            [1, 2, 3, 5, 4],
            [1, 2, 3, 5, 3],
            [1, 2, [1, 2, 3]],
            [1, 2, [1, 2, 3]],
            { name: [1, 2] },
            { name: [1, 2, 3] },
        ]
        function isEqual(v1, v2) {
            const type1 = v1 instanceof Object;
            const type2 = v2 instanceof Object;
            // 如果数据类型不相同
            if (type1 !== type2) {
                return false;
            }
            // 如果都是基础数据类型
            if (!type1) {
                return v1 === v2;
            }
            // 一个是对象，一个数组
            if (v1.contructor !== v2.contructor) {
                return false;
            }
            // 都是对象或者都是数组长度不相等的时候
            if (Object.values(v1).length !== Object.values(v2).length) {
                return false;
            }
            // 都是对象或者都是数组长度相等的时候
            for (const key in v1) {
                if (!isEqual(v1[key], v2[key])) {
                    return false;
                }
            }
            return true;
        }
        // Array.prototype.unique = function () {
        //     const res = [];
        //     for (const item of this) {
        //         if (!res.some((resItem) => isEqual(resItem, item))) {
        //             res.push(item);
        //         }
        //     };
        //     return res;
        // };
        // console.log(arr.unique());

        // ⭐
        Array.prototype.unique = function () {
            const uniqueArr = arr.reduce((prev, current) => {
                return prev.some(prevItem => isEqual(prevItem, current))
                ? prev
                : prev.concat([current])
                // :[...prev,current]
            }, []);
            return uniqueArr;
        };
        console.log(arr.unique());
        
    </script>
</body>
</html>